const textColorMap = {
    // 重置
    reset: '\x1b[0m',
    // 红色
    red: '\x1b[31m',
    // 绿色
    green: '\x1b[32m',
    // 黄色
    yellow: '\x1b[33m',
    // 蓝色
    blue: '\x1b[34m',
    // 紫色
    magenta: '\x1b[35m',
    // 青色
    cyan: '\x1b[36m',
    // 白色
    white: '\x1b[37m',
    // 背景黑色
    bgBlack: '\x1b[40m',
    // 背景红色
    bgRed: '\x1b[41m',
    // 背景绿色
    bgGreen: '\x1b[42m',
    // 背景黄色
    bgYellow: '\x1b[43m',
    // 背景蓝色
    bgBlue: '\x1b[44m',
    // 背景紫色
    bgMagenta: '\x1b[45m',
    // 背景青色
    bgCyan: '\x1b[46m',
    // 背景白色
    bgWhite: '\x1b[47m',
}

class ConsoleLog {

    texts = []
    textColor = ''
    isReset = false
    isInline = false
    isEndInline = false

    log() {
        const logText = `${textColorMap[this.textColor] || ''}${this.texts.join('')}\x1b${this.isReset ? '[0m' : ''}\r`
        if (this.isInline) {
            process.stdout.write(logText)
            if (this.isEndInline) {
                console.log('')
            }
        } else {
            console.log(logText)
        }
    }

    /**
     * @param {string[]} texts
     * @return {ConsoleLog}
     */
    constructor(texts) {
        this.texts = texts;
        return this
    }

    /**
     * 颜色
     * @param {string} color 颜色
     * @return {ConsoleLog}
     */
    color(color) {
        this.textColor = color
        return this
    }

    /**
     * 是否单行输出，可用于显示进度
     * @return {ConsoleLog}
     */
    inline() {
        this.isInline = true
        return this
    }

    /**
     * 是否最后一个单行输出，会追加换行，防止后面输出覆盖
     * @param {boolean} isEndInline 是否最后一个当行输出
     */
    endInline(isEndInline) {
        this.isEndInline = isEndInline
        return this
    }

    /**
     * 是否重置颜色
     * @param {boolean} isReset 是否重置颜色
     */
    reset(isReset = true) {
        this.isReset = isReset
        return this
    }
}

/**
 * 控制台打印
 * @param {...string[]} texts 文字
 */
function clog(...texts) {
    return new ConsoleLog(texts)
}

exports.clog = clog
